/*
其实想通了很简单，利用dfs搜索每个点只走一次的特性，统计走过的边数，然后用总边数减去走过的边数就是答案
值得注意的是，有可能这个图不是强连通图，有多个联通分量，所以要从每个点出发dfs一次才行，确保所有联通分量都考虑到
*/

#include <iostream>
#include <vector>
#include <algorithm>
#define endl '\n'
#define int long long
#define pii pair<int, int>
using namespace std;

// 已知
int n, m;
vector<int> g[222222]; // 邻接表建图，g[i]表示与i相邻的点
vector<bool> vis(222222, false); // 都没访问过
// 未知
int cnt;

void input()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v); // u可以连到v，u的儿子有v
        g[v].push_back(u); // v可以连到u，v的儿子有u
    }
}
void dfs(int u)
{
    vis[u] = true;      // 标记
    for (auto v : g[u]) // 遍历邻接点
    {
        if (!vis[v]) // 如果没访问过
        {
            cnt++;  // 走过的边增加
            dfs(v); // 继续走
        }
    }
}
signed main()
{
    input();
    for (int i = 1; i <= n; ++i) // 可以有多个联通分量
    {
        if (!vis[i]) dfs(i); // 所以要从每个点出发都试一下，看能走到几条边
    }
    cout << m - cnt << endl; // 删除的边数等于总边数减去走过的边数，dfs每个点只走1次
    return 0;
}